Pavlo Myronov
March 28, 2019
Develop web application that shows connection between Ukrainian MPs, based on a joint submission of bills.
With threshold = 50
library(jsonlite)##
## Attaching package: 'jsonlite'
## The following object is masked from 'package:purrr':
##
## flatten
bills_json <- fromJSON("bills-skl8.json", simplifyDataFrame = FALSE)
print(length(bills_json))## [1] 13178
glimpse(bills_json[[1]])## List of 21
## $ id : int 52575
## $ agenda :List of 3
## ..$ date : chr "2014-12-23"
## ..$ number: chr "37-VIII"
## ..$ uri : chr "https://zakon.rada.gov.ua/go/37-VIII"
## $ alternative :List of 1
## ..$ refBills:List of 3
## .. ..$ :List of 1
## .. ..$ :List of 1
## .. ..$ :List of 1
## $ authors : NULL
## $ bind :List of 1
## ..$ refBills:List of 1
## .. ..$ id: int 53253
## $ currentPhase :List of 2
## ..$ date : chr "18.02.2016"
## ..$ title: chr "Відхилено та знято з розгляду"
## $ documents :List of 2
## ..$ source :List of 1
## .. ..$ document:List of 3
## ..$ workflow:List of 1
## .. ..$ document:List of 2
## $ executives :List of 4
## ..$ :List of 2
## .. ..$ department: chr "Комітет у закордонних справах"
## .. ..$ person :List of 4
## ..$ :List of 2
## .. ..$ department: chr "Комітет з питань податкової та митної політики"
## .. ..$ person :List of 4
## ..$ :List of 2
## .. ..$ department: chr "Комітет з питань бюджету"
## .. ..$ person :List of 4
## ..$ :List of 2
## .. ..$ department: chr "Комітет з питань запобігання і протидії корупції"
## .. ..$ person :List of 4
## $ initiators :List of 7
## ..$ :List of 1
## .. ..$ official:List of 4
## ..$ :List of 1
## .. ..$ official:List of 4
## ..$ :List of 1
## .. ..$ official:List of 4
## ..$ :List of 1
## .. ..$ official:List of 4
## ..$ :List of 1
## .. ..$ official:List of 4
## ..$ :List of 1
## .. ..$ official:List of 4
## ..$ :List of 1
## .. ..$ official:List of 4
## $ mainExecutives :List of 1
## ..$ executive:List of 2
## .. ..$ department: chr "Комітет з питань європейської інтеграції"
## .. ..$ person :List of 4
## $ number : chr "0001"
## $ passings :List of 7
## ..$ :List of 2
## .. ..$ date : chr "2016-02-03"
## .. ..$ title: chr "В порядок денний не включено"
## ..$ :List of 2
## .. ..$ date : chr "2015-01-13"
## .. ..$ title: chr "Вручено подання Комітету про відхилення"
## ..$ :List of 2
## .. ..$ date : chr "2014-12-25"
## .. ..$ title: chr "Направлено до Комітету"
## ..$ :List of 2
## .. ..$ date : chr "2014-12-09"
## .. ..$ title: chr "Надано для ознайомлення"
## ..$ :List of 2
## .. ..$ date : chr "2014-12-08"
## .. ..$ title: chr "Направлено на розгляд Комітету"
## ..$ :List of 2
## .. ..$ date : chr "2014-12-08"
## .. ..$ title: chr "Передано на розгляд керівництву"
## ..$ :List of 2
## .. ..$ date : chr "2014-12-01"
## .. ..$ title: chr "Одержано Верховною Радою"
## $ registrationConvocation: chr "VIII скликання"
## $ registrationDate : chr "2014-12-01"
## $ registrationSession : chr "1 сесія"
## $ rubric : chr "Двосторонні міжнародні угоди"
## $ subject : chr "Народний депутат України"
## $ title : chr "про денонсацію Угоди між Урядом Союзу Радянських Соціалістичних Республік і Урядом Республіки Кіпр про уникненн"| __truncated__
## $ type : chr "Проект Закону"
## $ uri : chr "http://w1.c1.rada.gov.ua/pls/zweb2/webproc4_1?pf3511=52575"
## $ workOuts :List of 3
## ..$ date : chr "2014-12-01"
## ..$ documentType : chr "Проект Закону"
## ..$ workOutCommittees:List of 6
## .. ..$ :List of 3
## .. ..$ :List of 3
## .. ..$ :List of 3
## .. ..$ :List of 3
## .. ..$ :List of 3
## .. ..$ :List of 3
)
mps_posts <- fromJSON("mp-posts.json", simplifyDataFrame = TRUE)
glimpse(mps_posts)## Observations: 3,417
## Variables: 19
## $ mp_id <int> 18089, 18089, 18089, 18089, 18089, 18089, 18...
## $ post_id <int> 1, 2, 3, 4, 4, 4, 4, 4, 5, 4, 2, 6, 4, 4, 4,...
## $ unit_id <int> 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
## $ parent_id <int> 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, N...
## $ fr_post_id <int> 917, 918, NA, NA, NA, NA, NA, NA, NA, NA, 91...
## $ fr_association_id <int> 2937, 2613, NA, NA, NA, NA, NA, NA, NA, NA, ...
## $ department_name <chr> "підкомітету з питань оподаткування податком...
## $ full_name <chr> "Євлахов Анатолій Сергійович", "Євлахов Анат...
## $ parent_department <chr> "Комітет Верховної Ради України з питань под...
## $ post_name <chr> "Голова підкомітету Комітету Верховної Ради ...
## $ post_tag <chr> "post_frs", "post_frs", "post_mps", "post_mp...
## $ post_title <chr> "Голова підкомітету з питань оподаткування п...
## $ unit_code <chr> "kompmp13", "bp", "MAR", "ISR", "BLR", "POL"...
## $ unit_name <chr> "Підкомітет з питань оподаткування податком ...
## $ unit_type <chr> "sct", "fra", "mpg", "mpg", "mpg", "mpg", "m...
## $ mp_post_id <int> NA, NA, 1, 4, 4, 4, 4, 4, 2, 4, NA, NA, 4, 4...
## $ organization_id <int> NA, NA, 432, 62, 12, 43, 527, 29, 53, 9, NA,...
## $ organization_name <chr> NA, NA, "Депутатська група Верховної Ради Ук...
## $ association_name <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, ...
get_bills_rows <- function(x) {
initiators <- map_dfr(x$initiators, function(y) {
if ("official" %in% names(y)) {
data.frame(
init_id = na_if_null(y$official$person$id),
init_fullname = str_trim(paste(y$official$person$surname, y$official$person$firstname, y$official$person$patronymic)))
} else {
if ("outer" %in% names(y)) {
data.frame(
init_id = na_if_null(y$outer$person$id),
init_fullname = str_trim(paste(y$outer$person$surname, y$outer$person$firstname, y$outer$person$patronymic)))
} else {
data.frame(
init_id = na_if_null(y$person$id),
init_fullname = str_trim(paste(y$person$surname, y$person$firstname, y$person$patronymic)))
}
}
})
initiators %>%
mutate(
number = as.character(x$number),
department = na_if_null(x$mainExecutives$executive$department),
type = x$type
)
}Extracting id and fullname of each initiator as data.frame rows
function(y) {
if ("official" %in% names(y)) {
data.frame(
init_id = na_if_null(y$official$person$id),
init_fullname = str_trim(paste(y$official$person$surname, y$official$person$firstname, y$official$person$patronymic)))
} else {
if ("outer" %in% names(y)) {
data.frame(
init_id = na_if_null(y$outer$person$id),
init_fullname = str_trim(paste(y$outer$person$surname, y$outer$person$firstname, y$outer$person$patronymic)))
} else {
data.frame(
init_id = na_if_null(y$person$id),
init_fullname = str_trim(paste(y$person$surname, y$person$firstname, y$person$patronymic)))
}
}
}Applying the function to list of initiators
initiators <- map_dfr(x$initiators, function(y) {
if ("official" %in% names(y)) {
data.frame(
init_id = na_if_null(y$official$person$id),
init_fullname = str_trim(paste(y$official$person$surname, y$official$person$firstname, y$official$person$patronymic)))
} else {
if ("outer" %in% names(y)) {
data.frame(
init_id = na_if_null(y$outer$person$id),
init_fullname = str_trim(paste(y$outer$person$surname, y$outer$person$firstname, y$outer$person$patronymic)))
} else {
data.frame(
init_id = na_if_null(y$person$id),
init_fullname = str_trim(paste(y$person$surname, y$person$firstname, y$person$patronymic)))
}
}
})
initiators## init_id init_fullname
## 1 1792 Тимошенко Юлія Володимирівна
## 2 2524 Абдуллін Олександр Рафкатович
## 3 735 Кужель Олександра Володимирівна
## 4 18054 Луценко Ігор Вікторович
## 5 5486 Тарасюк Борис Іванович
## 6 386 Соболєв Сергій Владиславович
## 7 11728 Євтушок Сергій Миколайович
map_dfr(.x, .f, …, .id = NULL)
Function from purrr package. It means: take data.frames that was
produced by each iteration of the function and bind them by rows.
Adding information on bill to initiators table
initiators %>%
mutate(
number = as.character(x$number),
department = na_if_null(x$mainExecutives$executive$department),
type = x$type
)## init_id init_fullname number
## 1 1792 Тимошенко Юлія Володимирівна 0001
## 2 2524 Абдуллін Олександр Рафкатович 0001
## 3 735 Кужель Олександра Володимирівна 0001
## 4 18054 Луценко Ігор Вікторович 0001
## 5 5486 Тарасюк Борис Іванович 0001
## 6 386 Соболєв Сергій Владиславович 0001
## 7 11728 Євтушок Сергій Миколайович 0001
## department type
## 1 Комітет з питань європейської інтеграції Проект Закону
## 2 Комітет з питань європейської інтеграції Проект Закону
## 3 Комітет з питань європейської інтеграції Проект Закону
## 4 Комітет з питань європейської інтеграції Проект Закону
## 5 Комітет з питань європейської інтеграції Проект Закону
## 6 Комітет з питань європейської інтеграції Проект Закону
## 7 Комітет з питань європейської інтеграції Проект Закону
%>% means “make an expression on the left an argument of a function on the right”
c(2, 2) %>% sum()## [1] 4
equals
sum(c(2,2))## [1] 4
Simple function, written to avoid errors of different number of values in data.frame columns
na_if_null <- function(x) {
x[is.null(x)] <- NA
x
}all_init <- map_dfr(bills_json, get_bills_rows)
glimpse(all_init)## Observations: 47,276
## Variables: 5
## $ init_id <int> 1792, 2524, 735, 18054, 5486, 386, 11728, 11121,...
## $ init_fullname <chr> "Тимошенко Юлія Володимирівна", "Абдуллін Олекса...
## $ number <chr> "0001", "0001", "0001", "0001", "0001", "0001", ...
## $ department <chr> "Комітет з питань європейської інтеграції", "Ком...
## $ type <chr> "Проект Закону", "Проект Закону", "Проект Закону...
## # A tibble: 75,669 x 3
## init_fullname.x init_fullname.y n
## <chr> <chr> <int>
## 1 Абдуллін Олександр Рафкатович Алексєєв Ігор Сергійович 2
## 2 Абдуллін Олександр Рафкатович Алєксєєв Сергій Олегович 3
## 3 Абдуллін Олександр Рафкатович Амельченко Василь Васильович 2
## 4 Абдуллін Олександр Рафкатович Андрієвський Дмитро Йосипович 3
## 5 Абдуллін Олександр Рафкатович Антонищак Андрій Федорович 2
## 6 Абдуллін Олександр Рафкатович Ар'єв Володимир Ігорович 3
## 7 Абдуллін Олександр Рафкатович Арешонков Володимир Юрійович 2
## 8 Абдуллін Олександр Рафкатович Артюшенко Ігор Андрійович 1
## 9 Абдуллін Олександр Рафкатович Бабак Альона Валеріївна 4
## 10 Абдуллін Олександр Рафкатович Бабій Юрій Юрійович 2
## # ... with 75,659 more rows
First two columns indicates MPs, the third - the number of bills they sumbitted together
initiators.y <- all_init %>%
select(number, init_fullname)
init <- all_init %>%
filter(type == "Проект Закону") %>%
inner_join(y = initiators.y, by = "number") %>%
filter(init_fullname.x != init_fullname.y) %>%
group_by(init_fullname.x, init_fullname.y) %>%
count() %>%
mutate(pair = (
sort(c(init_fullname.x, init_fullname.y)) %>% paste0(collapse = "|")
)) %>%
group_by(pair) %>%
mutate(order = seq_along(pair)) %>%
filter(order == 1) %>%
ungroup() %>%
select(-pair, -order)initiators.y <- all_init %>%
select(number, init_fullname)
glimpse(initiators.y)## Observations: 47,276
## Variables: 2
## $ number <chr> "0001", "0001", "0001", "0001", "0001", "0001", ...
## $ init_fullname <chr> "Тимошенко Юлія Володимирівна", "Абдуллін Олекса...
init <- all_init %>%
filter(type == "Проект Закону")
glimpse(init)## Observations: 31,571
## Variables: 5
## $ init_id <int> 1792, 2524, 735, 18054, 5486, 386, 11728, 16672,...
## $ init_fullname <chr> "Тимошенко Юлія Володимирівна", "Абдуллін Олекса...
## $ number <chr> "0001", "0001", "0001", "0001", "0001", "0001", ...
## $ department <chr> "Комітет з питань європейської інтеграції", "Ком...
## $ type <chr> "Проект Закону", "Проект Закону", "Проект Закону...
init <- init %>%
inner_join(y = initiators.y, by = "number")
glimpse(init)## Observations: 726,491
## Variables: 6
## $ init_id <int> 1792, 1792, 1792, 1792, 1792, 1792, 1792, 2524...
## $ init_fullname.x <chr> "Тимошенко Юлія Володимирівна", "Тимошенко Юлі...
## $ number <chr> "0001", "0001", "0001", "0001", "0001", "0001"...
## $ department <chr> "Комітет з питань європейської інтеграції", "К...
## $ type <chr> "Проект Закону", "Проект Закону", "Проект Зако...
## $ init_fullname.y <chr> "Тимошенко Юлія Володимирівна", "Абдуллін Олек...
init <- init %>%
filter(init_fullname.x != init_fullname.y)
glimpse(init)## Observations: 694,888
## Variables: 6
## $ init_id <int> 1792, 1792, 1792, 1792, 1792, 1792, 2524, 2524...
## $ init_fullname.x <chr> "Тимошенко Юлія Володимирівна", "Тимошенко Юлі...
## $ number <chr> "0001", "0001", "0001", "0001", "0001", "0001"...
## $ department <chr> "Комітет з питань європейської інтеграції", "К...
## $ type <chr> "Проект Закону", "Проект Закону", "Проект Зако...
## $ init_fullname.y <chr> "Абдуллін Олександр Рафкатович", "Кужель Олекс...
init <- init %>%
group_by(init_fullname.x, init_fullname.y) %>%
count()
glimpse(init)## Observations: 151,338
## Variables: 3
## $ init_fullname.x <chr> "Абдуллін Олександр Рафкатович", "Абдуллін Оле...
## $ init_fullname.y <chr> "Алексєєв Ігор Сергійович", "Алєксєєв Сергій О...
## $ n <int> 2, 3, 2, 3, 2, 3, 2, 1, 4, 2, 2, 2, 1, 1, 1, 2...
init <- init %>%
mutate(pair = (
sort(c(init_fullname.x, init_fullname.y)) %>% paste0(collapse = "|")
)) %>%
group_by(pair) %>%
mutate(order = seq_along(pair)) %>%
filter(order == 1) %>%
ungroup() %>%
select(-pair, -order)
glimpse(init)## Observations: 75,669
## Variables: 3
## $ init_fullname.x <chr> "Абдуллін Олександр Рафкатович", "Абдуллін Оле...
## $ init_fullname.y <chr> "Алексєєв Ігор Сергійович", "Алєксєєв Сергій О...
## $ n <int> 2, 3, 2, 3, 2, 3, 2, 1, 4, 2, 2, 2, 1, 1, 1, 2...
init %>%
mutate(pair = (
sort(c(init_fullname.x, init_fullname.y)) %>% paste0(collapse = "|")
))## # A tibble: 151,338 x 4
## # Groups: init_fullname.x, init_fullname.y [151,338]
## init_fullname.x init_fullname.y n pair
## <chr> <chr> <int> <chr>
## 1 Абдуллін Олександр Рафкатович Алексєєв Ігор Сергійович 2 Абду…
## 2 Абдуллін Олександр Рафкатович Алєксєєв Сергій Олегович 3 Абду…
## 3 Абдуллін Олександр Рафкатович Амельченко Василь Васильович 2 Абду…
## 4 Абдуллін Олександр Рафкатович Андрієвський Дмитро Йосипович 3 Абду…
## 5 Абдуллін Олександр Рафкатович Антонищак Андрій Федорович 2 Абду…
## 6 Абдуллін Олександр Рафкатович Ар'єв Володимир Ігорович 3 Абду…
## 7 Абдуллін Олександр Рафкатович Арешонков Володимир Юрійович 2 Абду…
## 8 Абдуллін Олександр Рафкатович Артюшенко Ігор Андрійович 1 Абду…
## 9 Абдуллін Олександр Рафкатович Бабак Альона Валеріївна 4 Абду…
## 10 Абдуллін Олександр Рафкатович Бабій Юрій Юрійович 2 Абду…
## # ... with 151,328 more rows
init %>%
mutate(pair = (
sort(c(init_fullname.x, init_fullname.y)) %>% paste0(collapse = "|")
)) %>%
group_by(pair)## # A tibble: 151,338 x 4
## # Groups: pair [75,669]
## init_fullname.x init_fullname.y n pair
## <chr> <chr> <int> <chr>
## 1 Абдуллін Олександр Рафкатович Алексєєв Ігор Сергійович 2 Абду…
## 2 Абдуллін Олександр Рафкатович Алєксєєв Сергій Олегович 3 Абду…
## 3 Абдуллін Олександр Рафкатович Амельченко Василь Васильович 2 Абду…
## 4 Абдуллін Олександр Рафкатович Андрієвський Дмитро Йосипович 3 Абду…
## 5 Абдуллін Олександр Рафкатович Антонищак Андрій Федорович 2 Абду…
## 6 Абдуллін Олександр Рафкатович Ар'єв Володимир Ігорович 3 Абду…
## 7 Абдуллін Олександр Рафкатович Арешонков Володимир Юрійович 2 Абду…
## 8 Абдуллін Олександр Рафкатович Артюшенко Ігор Андрійович 1 Абду…
## 9 Абдуллін Олександр Рафкатович Бабак Альона Валеріївна 4 Абду…
## 10 Абдуллін Олександр Рафкатович Бабій Юрій Юрійович 2 Абду…
## # ... with 151,328 more rows
init %>%
mutate(pair = (
sort(c(init_fullname.x, init_fullname.y)) %>% paste0(collapse = "|")
)) %>%
group_by(pair) %>%
mutate(order = seq_along(pair)) ## # A tibble: 151,338 x 5
## # Groups: pair [75,669]
## init_fullname.x init_fullname.y n pair order
## <chr> <chr> <int> <chr> <int>
## 1 Абдуллін Олександр Рафкатович Алексєєв Ігор Се… 2 Абдуллін О… 1
## 2 Абдуллін Олександр Рафкатович Алєксєєв Сергій … 3 Абдуллін О… 1
## 3 Абдуллін Олександр Рафкатович Амельченко Васил… 2 Абдуллін О… 1
## 4 Абдуллін Олександр Рафкатович Андрієвський Дми… 3 Абдуллін О… 1
## 5 Абдуллін Олександр Рафкатович Антонищак Андрій… 2 Абдуллін О… 1
## 6 Абдуллін Олександр Рафкатович Ар'єв Володимир … 3 Абдуллін О… 1
## 7 Абдуллін Олександр Рафкатович Арешонков Володи… 2 Абдуллін О… 1
## 8 Абдуллін Олександр Рафкатович Артюшенко Ігор А… 1 Абдуллін О… 1
## 9 Абдуллін Олександр Рафкатович Бабак Альона Вал… 4 Абдуллін О… 1
## 10 Абдуллін Олександр Рафкатович Бабій Юрій Юрійо… 2 Абдуллін О… 1
## # ... with 151,328 more rows
init %>%
mutate(pair = (
sort(c(init_fullname.x, init_fullname.y)) %>% paste0(collapse = "|")
)) %>%
group_by(pair) %>%
mutate(order = seq_along(pair)) %>%
filter(order == 1) ## # A tibble: 75,669 x 5
## # Groups: pair [75,669]
## init_fullname.x init_fullname.y n pair order
## <chr> <chr> <int> <chr> <int>
## 1 Абдуллін Олександр Рафкатович Алексєєв Ігор Се… 2 Абдуллін О… 1
## 2 Абдуллін Олександр Рафкатович Алєксєєв Сергій … 3 Абдуллін О… 1
## 3 Абдуллін Олександр Рафкатович Амельченко Васил… 2 Абдуллін О… 1
## 4 Абдуллін Олександр Рафкатович Андрієвський Дми… 3 Абдуллін О… 1
## 5 Абдуллін Олександр Рафкатович Антонищак Андрій… 2 Абдуллін О… 1
## 6 Абдуллін Олександр Рафкатович Ар'єв Володимир … 3 Абдуллін О… 1
## 7 Абдуллін Олександр Рафкатович Арешонков Володи… 2 Абдуллін О… 1
## 8 Абдуллін Олександр Рафкатович Артюшенко Ігор А… 1 Абдуллін О… 1
## 9 Абдуллін Олександр Рафкатович Бабак Альона Вал… 4 Абдуллін О… 1
## 10 Абдуллін Олександр Рафкатович Бабій Юрій Юрійо… 2 Абдуллін О… 1
## # ... with 75,659 more rows
init <- init %>%
mutate(pair = (
sort(c(init_fullname.x, init_fullname.y)) %>% paste0(collapse = "|")
)) %>%
group_by(pair) %>%
mutate(order = seq_along(pair)) %>%
filter(order == 1) %>%
ungroup() %>%
select(-pair, -order)## Observations: 424
## Variables: 4
## $ full_name <chr> "Абдуллін Олександр Рафкатович", "Алексєєв Ігор С...
## $ mp_id <int> 2524, 16067, 17993, 12290, 15839, 17983, 11118, 1...
## $ unit_name <chr> "Фракція політичної партії \"Всеукраїнське об'єдн...
## $ bills_number <int> 55, 88, 151, 179, 137, 144, 73, 178, 66, 92, 23, ...
bills_number - total amount of bills initiated by MP
bills_number <- all_init %>%
group_by(init_id, init_fullname) %>%
count() %>%
rename(bills_number = n)
mps <- mps_posts %>%
select(full_name, mp_id) %>%
distinct() %>%
left_join(mps_posts %>%
filter(unit_type %in% c("fra", "grp")) %>%
select(mp_id, full_name, unit_name) %>%
distinct()) %>%
mutate(unit_name = case_when(
is.na(unit_name) ~ "Позафракційні",
TRUE ~ unit_name)) %>%
mutate(full_name = str_trim(full_name)) %>%
left_join(bills_number, by=c("mp_id" = "init_id", "full_name" = "init_fullname")) %>%
arrange(full_name)## Joining, by = c("full_name", "mp_id")
https://github.com/rstudio/cheatsheets/raw/master/data-transformation.pdf
library(igraph)
library(ggraph)
library(networkD3)
library(tidyr)glimpse(init)## Observations: 75,669
## Variables: 3
## $ init_fullname.x <chr> "Абдуллін Олександр Рафкатович", "Абдуллін Оле...
## $ init_fullname.y <chr> "Алексєєв Ігор Сергійович", "Алєксєєв Сергій О...
## $ n <int> 2, 3, 2, 3, 2, 3, 2, 1, 4, 2, 2, 2, 1, 1, 1, 2...
glimpse(mps)## Observations: 424
## Variables: 4
## $ full_name <chr> "Абдуллін Олександр Рафкатович", "Алексєєв Ігор С...
## $ mp_id <int> 2524, 16067, 17993, 12290, 15839, 17983, 11118, 1...
## $ unit_name <chr> "Фракція політичної партії \"Всеукраїнське об'єдн...
## $ bills_number <int> 55, 88, 151, 179, 137, 144, 73, 178, 66, 92, 23, ...
filter(init, n > 100) ## # A tibble: 14 x 3
## init_fullname.x init_fullname.y n
## <chr> <chr> <int>
## 1 Вовк Віктор Іванович Ляшко Олег Валерійович 115
## 2 Галасюк Віктор Валерійович Ляшко Олег Валерійович 144
## 3 Головко Михайло Йосифович Іллєнко Андрій Юрійович 129
## 4 Головко Михайло Йосифович Левченко Юрій Володимирович 127
## 5 Головко Михайло Йосифович Марченко Олександр Олександрович 121
## 6 Головко Михайло Йосифович Осуховський Олег Іванович 134
## 7 Іллєнко Андрій Юрійович Левченко Юрій Володимирович 137
## 8 Іллєнко Андрій Юрійович Марченко Олександр Олександрович 122
## 9 Іллєнко Андрій Юрійович Осуховський Олег Іванович 131
## 10 Королевська Наталія Юріївна Солод Юрій Васильович 122
## 11 Левченко Юрій Володимирович Марченко Олександр Олександрович 119
## 12 Левченко Юрій Володимирович Осуховський Олег Іванович 127
## 13 Марченко Олександр Олександрович Осуховський Олег Іванович 123
## 14 Мацола Роман Миколайович Шинькович Андрій Васильович 126
filter(init, n > 100) %>%
graph_from_data_frame()## IGRAPH 06724d1 DN-- 12 14 --
## + attr: name (v/c), n (e/n)
## + edges from 06724d1 (vertex names):
## [1] Вовк Віктор Іванович ->Ляшко Олег Валерійович
## [2] Галасюк Віктор Валерійович->Ляшко Олег Валерійович
## [3] Головко Михайло Йосифович ->Іллєнко Андрій Юрійович
## [4] Головко Михайло Йосифович ->Левченко Юрій Володимирович
## [5] Головко Михайло Йосифович ->Марченко Олександр Олександрович
## [6] Головко Михайло Йосифович ->Осуховський Олег Іванович
## [7] Іллєнко Андрій Юрійович ->Левченко Юрій Володимирович
## [8] Іллєнко Андрій Юрійович ->Марченко Олександр Олександрович
## + ... omitted several edges
filter(init, n > 100) %>%
graph_from_data_frame() %>%
ggraph() +
geom_edge_link() +
geom_node_point() +
theme_void()function that solves this problem
create_graph <- function(edges, vertices) {
edges <- edges %>%
filter(init_fullname.x %in% vertices$full_name,
init_fullname.y %in% vertices$full_name)
v_in_edges <-edges %>%
gather(key = vert_type, value = vertice, init_fullname.x:init_fullname.y) %>%
select(vertice) %>%
distinct() %>%
pull()
vertices <- vertices %>%
filter(full_name %in% v_in_edges)
g <- graph_from_data_frame(edges, vertices = vertices)
g
}init %>%
gather(key = vert_type, value = vertice, init_fullname.x:init_fullname.y) %>%
glimpse()## Observations: 151,338
## Variables: 3
## $ n <int> 2, 3, 2, 3, 2, 3, 2, 1, 4, 2, 2, 2, 1, 1, 1, 2, 1, 5...
## $ vert_type <chr> "init_fullname.x", "init_fullname.x", "init_fullname...
## $ vertice <chr> "Абдуллін Олександр Рафкатович", "Абдуллін Олександр...
edges <- edges %>%
filter(init_fullname.x %in% vertices$full_name,
init_fullname.y %in% vertices$full_name)
glimpse(edges)## Observations: 14
## Variables: 3
## $ init_fullname.x <chr> "Вовк Віктор Іванович", "Галасюк Віктор Валері...
## $ init_fullname.y <chr> "Ляшко Олег Валерійович", "Ляшко Олег Валерійо...
## $ n <int> 115, 144, 129, 127, 121, 134, 137, 122, 131, 1...
v_in_edges <-edges %>%
gather(key = vert_type, value = vertice, init_fullname.x:init_fullname.y) %>%
select(vertice) %>%
distinct() %>%
pull()
glimpse(v_in_edges)## chr [1:12] "Вовк Віктор Іванович" "Галасюк Віктор Валерійович" ...
vertices <- vertices %>%
filter(full_name %in% v_in_edges)
glimpse(vertices)## Observations: 12
## Variables: 4
## $ full_name <chr> "Вовк Віктор Іванович", "Галасюк Віктор Валерійов...
## $ mp_id <int> 8132, 18046, 15813, 15837, 8693, 16672, 8818, 181...
## $ unit_name <chr> "Фракція Радикальної партії Олега Ляшка", "Фракці...
## $ bills_number <int> 193, 425, 274, 195, 208, 285, 407, 189, 214, 195,...
g <- graph_from_data_frame(edges, vertices = vertices)
g## IGRAPH 00a3e74 DN-- 12 14 --
## + attr: name (v/c), mp_id (v/n), unit_name (v/c), bills_number
## | (v/n), n (e/n)
## + edges from 00a3e74 (vertex names):
## [1] Вовк Віктор Іванович ->Ляшко Олег Валерійович
## [2] Галасюк Віктор Валерійович->Ляшко Олег Валерійович
## [3] Головко Михайло Йосифович ->Іллєнко Андрій Юрійович
## [4] Головко Михайло Йосифович ->Левченко Юрій Володимирович
## [5] Головко Михайло Йосифович ->Марченко Олександр Олександрович
## [6] Головко Михайло Йосифович ->Осуховський Олег Іванович
## [7] Іллєнко Андрій Юрійович ->Левченко Юрій Володимирович
## + ... omitted several edges
igraph_to_networkD3() creates network from igraph object
igraph_to_networkD3(g, group = get.vertex.attribute(g, "unit_name")) %>%
glimpse()## List of 2
## $ links:'data.frame': 14 obs. of 3 variables:
## ..$ source: num [1:14] 2 2 3 0 1 2 3 5 2 3 ...
## ..$ target: num [1:14] 3 5 5 6 6 7 7 7 9 9 ...
## ..$ value : int [1:14] 129 127 137 115 144 121 122 119 134 131 ...
## $ nodes:'data.frame': 12 obs. of 2 variables:
## ..$ name : Factor w/ 12 levels "Вовк Віктор Іванович",..: 1 2 3 4 5 6 7 8 9 10 ...
## ..$ group: Factor w/ 4 levels "Позафракційні",..: 4 4 1 1 3 1 4 1 2 1 ...
…forceNetwork() shows it
network <- igraph_to_networkD3(g, group = get.vertex.attribute(g, "unit_name"))
forceNetwork(Links = network$links, Nodes = network$nodes, Source = "source", Target = "target",
NodeID = "name", Group = "group", legend = TRUE, opacity = 0.9, fontSize = 13,
bounded = TRUE, charge = -15)mps_force_network <- function(edges, vertices) {
g <- create_graph(edges, vertices)
network <- igraph_to_networkD3(g, group = get.vertex.attribute(g, "unit_name"))
network$nodes$size <- get.vertex.attribute(g, "bills_number") / max(get.vertex.attribute(g, "bills_number")) * 100
forceNetwork(Links = network$links, Nodes = network$nodes, Source = "source", Target = "target",
NodeID = "name", Group = "group", Nodesize = "size", legend = TRUE, opacity = 0.9, fontSize = 13,
bounded = TRUE, charge = -15)
}filtering by number of common bills
mps_force_network(filter(init, n > 50), mps)mps_force_network(filter(init, n > 20), filter(mps, unit_name == "Позафракційні"))library(shiny)##
## Attaching package: 'shiny'
## The following object is masked from 'package:jsonlite':
##
## validate
Shiny is an easy way to create web application using R without knowledge of server technologies, javascript, css and even html.
ui() is responsible for input and output elements server() - for the constructing output
#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
# http://shiny.rstudio.com/
#
library(shiny)
library(dplyr)
library(tidyr)
library(networkD3)
library(igraph)
library(stringr)
source("functions.R")
load("mps.Rda")
load("init.Rda")
# Define UI for application that creates networks
ui <- fluidPage(
# Application title
titlePanel("MPs' networks"),
# Sidebar with a slider and checkboxGroup input
sidebarLayout(
sidebarPanel(
sliderInput("bills_threshold",
"Minimal number of shared bills:",
min = 1,
max = 100,
value = 40),
checkboxGroupInput("factions",
label = "Choose factions you want to see:",
#
choices = unique(mps$unit_name),
selected = unique(mps$unit_name))
),
mainPanel(
forceNetworkOutput("networkPlot")
)
)
)
# Define server logic
server <- function(input, output) {
output$networkPlot <- renderForceNetwork({
mps_force_network(filter(init, n >= input$bills_threshold),
filter(mps, mps$unit_name %in% input$factions))
})
}
# Run the application
shinyApp(ui = ui, server = server)##
## Listening on http://127.0.0.1:5085
install.packages('rsconnect')
library(rsconnect)
rsconnect::setAccountInfo(name="<ACCOUNT>", token="<TOKEN>", secret="<SECRET>")If you need more - it is better run your own server than pay for paid version
The variety of cheatsheets:
www.rstudio.com/resources/cheatsheets/
Shiny section:
shiny.rstudio.com/
Contact me:
paul.myronov@gmail.com
fb.com/pavlo.myronov